import java.util.ArrayList;
import java.util.List;

public class LeetCode216 {
    public static List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> res = new ArrayList<>();
        backtrack(k, n, new ArrayList<>(), res, 1);
        return res;
    }

    public static void backtrack(int k, int target, List<Integer> list, List<List<Integer>> res, int start) {
        //递归终止条件
        if (list.size() == k && target == 0) {
            res.add(new ArrayList<>(list));
            return;
        }
        // 剪枝条件
        if (list.size() > k || target < 0) {
            return;
        }
//         递归逻辑
        for (int i = start; i <= 9; i++) {
            // 选择当前数字
            list.add(i);
            // 递归调用
            backtrack(k, target-i, list, res, i + 1);
            // 回溯，撤销选择
            list.remove(list.size() - 1);
        }
    }

}
